#include <iostream>
#include <vector>
using namespace std;

void fn() {
  int n = 10;

  cout << n * 2 << endl;
}

class Demo {
public:
  // 构造函数 - 变量被创建的时候 C++ 自动调用的函数
  Demo() { cout<< "A demo is created." << endl; }

  // 析构函数 - 变量被销毁的时候 C++ 自动调用的函数
  ~Demo() { cout << "A demo is deallocated." << endl; }
};

int main(int argc, char const *argv[])
{
  // 1. 自动变量 - 进入作用域之后会自动创建，并且离开作用域之后会被 C++ 自动回收的变量。
  // 2. 作用域  - 可以使用一个变量的区域
  // 3. 手动变量 - 用 new 操作符手动创建，不会被 C++ 自动回收的变量

  int ten = 10;

  // int * - 表示保存一个整数变量的位置
  int *t = new int{10}; // 创建一个值为 10 的手动整数变量
  cout << *t << endl;
  
  string *ps = new string {"Hello"};
  cout << *ps << endl;

  // 我们怎么证明一个手动变量不会在离开作用域的时候被 C++ 销毁
  if (1) {
    Demo *pd = new Demo();

    delete pd;
  }
  
  cout << "After the creation of d." << endl;


  // 1. 用 new 创建一个值为 1, 2, 3, 4, 5 的数组
  // * v1 保存的是一个 vector<int> 的位置
  // 保存手动变量位置的变量叫做 指针变量
  vector<int> *v1 = new vector<int> {1, 2, 3, 4, 5};

  for (int n : (*v1)) {
    cout << n << endl;
  }

  for (int i = 0; i < v1->size(); ++i) {
    cout << (*v1)[i] << endl;
  }
  return 0;
}
